package com.gftBrazil.BankSystem.business;

import com.gftBrazil.BankSystem.bean.ClienteBean;
import com.gftBrazil.BankSystem.bean.ClienteFisicoBean;
import com.gftBrazil.BankSystem.bean.ClienteJuridicoBean;
import com.gftBrazil.BankSystem.bean.enums.EstadoCliente;
import com.gftBrazil.BankSystem.util.Sucess;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JComponent;

/**
 *
 * @author JRSS
 */
public class ClienteBusiness {

    private static final ClienteBusiness instance = new ClienteBusiness();
    private static ClienteBean cliente;
    private static List<ClienteBean> clientes = new ArrayList<>();
    private final List<JComponent> componentes = new ArrayList<>();
    private int lastID = 1;

    public static final ClienteBusiness getInstance() {
        return instance;
    }

    public Sucess cadastrarCliente(ClienteBean cliente) {
        Sucess sucess;
        if (validarCliente()) {
            cliente.setEstadoCliente(EstadoCliente.ATIVO);
            ClienteBusiness.setCliente(cliente);
            armazenarCliente(cliente);
            sucess = new Sucess("Cliente " + lastID + " armazenado com sucesso!");
        } else {
            sucess = new Sucess("Cliente nao armazenado!");
        }
        return sucess;
    }

    public ClienteBean consultarClientePorCodigo(int codigoCliente) {
        ClienteBean clienteAux = null;
        for (ClienteBean c : getClientes()) {
            if (c.getCodigoCliente() == codigoCliente) {
                clienteAux = c;
                break;
            }
        }
        return clienteAux;
    }

    private boolean validarCliente() {
        boolean sucess;
        sucess = getCliente().getNome() != null
                && getCliente().getCidade() != null
                && getCliente().getDocumento() != null;
        return sucess;
    }

    public Sucess bloquear(ClienteBean cliente) {
        Sucess sucess;
        ClienteBean c = null;
        if (cliente instanceof ClienteFisicoBean) {
            c = new ClienteFisicoBean();
        } else if (cliente instanceof ClienteJuridicoBean) {
            c = new ClienteJuridicoBean();
        }
        setCliente(c);
        if (getCliente() == null) {
            sucess = new Sucess("O cliente nao pode ser bloqueado!");
        } else {
            setCliente(consultarClientePorCodigo(cliente.getCodigoCliente()));
            getCliente().setEstadoCliente(EstadoCliente.BLOQUEADO);
            sucess = new Sucess("Cliente bloqueado com sucesso!");
        }
        return sucess;
    }

    public Sucess reativar(ClienteBean cliente) {
        Sucess sucess;
        ClienteBean c = null;
        if (cliente instanceof ClienteFisicoBean) {
            c = new ClienteFisicoBean();
        } else if (cliente instanceof ClienteJuridicoBean) {
            c = new ClienteJuridicoBean();
        }
        setCliente(c);
        if (getCliente() == null) {
            sucess = new Sucess("O cliente nao pode ser reativado!");
        } else {
            setCliente(consultarClientePorCodigo(cliente.getCodigoCliente()));
            getCliente().setEstadoCliente(EstadoCliente.ATIVO);
            sucess = new Sucess("Cliente reativado com sucesso!");
        }
        return sucess;
    }

    public Sucess cancelar(ClienteBean cliente) {
        Sucess sucess;
        ClienteBean c = null;
        if (cliente instanceof ClienteFisicoBean) {
            c = new ClienteFisicoBean();
        } else if (cliente instanceof ClienteJuridicoBean) {
            c = new ClienteJuridicoBean();
        }
        setCliente(c);
        if (getCliente() == null) {
            sucess = new Sucess("O cliente nao pode ser cancelado!");
        } else {
            setCliente(consultarClientePorCodigo(cliente.getCodigoCliente()));
            getCliente().setEstadoCliente(EstadoCliente.CANCELADO);
            sucess = new Sucess("Cliente cancelado com sucesso!");
        }
        return sucess;
    }

    private void armazenarCliente(ClienteBean cliente) {
        lastID = 1;
        if (!clientes.isEmpty()) {
            boolean first = true;
            for (ClienteBean c : getClientes()) {
                if (first) {
                    first = false;
                    lastID = c.getCodigoCliente();
                } else {
                    if (lastID < c.getCodigoCliente()) {
                        lastID = c.getCodigoCliente();
                    }
                }
            }
            lastID++;
        }
        cliente.setCodigoCliente(lastID);
        getClientes().add(cliente);
    }

    /**
     * @return the cliente
     */
    public static ClienteBean getCliente() {
        return cliente;
    }

    /**
     * @param aCliente the cliente to set
     */
    public static void setCliente(ClienteBean aCliente) {
        cliente = aCliente;
    }

    /**
     * @return the clientes
     */
    public static List<ClienteBean> getClientes() {
        return clientes;
    }

    /**
     * @param aClientes the clientes to set
     */
    public static void setClientes(List<ClienteBean> aClientes) {
        clientes = aClientes;
    }

    public List<ClienteBean> listarClientes() {
        return getClientes();
    }

    public List<ClienteFisicoBean> listarClientesFisicos() {
        List<ClienteFisicoBean> lista = new ArrayList<>();
        for (ClienteBean c : getClientes()) {
            if (c instanceof ClienteFisicoBean) {
                lista.add((ClienteFisicoBean) c);
            }
        }

        return lista;
    }

    public List<ClienteJuridicoBean> listarClientesJuridicos() {
        List<ClienteJuridicoBean> lista = new ArrayList<>();
        for (ClienteBean c : getClientes()) {
            if (c instanceof ClienteJuridicoBean) {
                lista.add((ClienteJuridicoBean) c);
            }
        }
        return lista;
    }
}
